import numpy as np
from sklearn.datasets import load_boston
from sklearn.decomposition import PCA
from sklearn.preprocessing import MinMaxScaler
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import Lasso
from sklearn.metrics import r2_score

# 2.	使用波士顿数据集，完成以下处理
# (1)	数据处理
# ①	读取波士顿数据集，获取特征和标签
x, y = load_boston(return_X_y=True)

# (2)	管道处理（不使用管道不得分）
# ①	将数据降维为4维
# ②	将降维后数据进行归一化处理
pipe = Pipeline([
    ['decomposition', PCA(n_components=4)],
    ['scaler', MinMaxScaler()]
])
x = pipe.fit_transform(x)

# (3)	数据处理
# ①	数据切分为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7)

# ②	创建L1正则，分别使用学习率为0.1,0.5，0.8，进行网格搜索交叉验证
grid = GridSearchCV(Lasso(),
                    dict(alpha=[0.1, 0.5, 0.8]),
                    cv=5,
                    iid=True)
grid.fit(x_train, y_train)

# ③	打印最优参数和得分
print(f'最优参数: {grid.best_params_}')
print(f'最优得分: {grid.best_score_}')

# ④	使用最优参数创建模型，打印测试集R2数据结果
model = Lasso(**(grid.best_params_))
model.fit(x_train, y_train)
h_test = model.predict(x_test)
print(f'测试集R2数据结果: {r2_score(y_test, h_test)}')

# ⑤	打印模型的参数和截距
print(f'模型的参数: {model.coef_}')
print(f'模型的截距: {model.intercept_}')
